home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / cprog.EXE / OBJ2ASM.ZIP / ORCOMENT.C < prev    next >
Text File  |  1991-10-02  |  13KB  |  406 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5. #include "o.h"
  6.                                         /*----- Comment Record Types ------*/
  7. #define MSLANG  0                       /* 00h - MS Language Name          */
  8. #define MSDOSV  156                     /* BCh - MS DOS Level Number (?)   */
  9. #define MSMODL  157                     /* BDh - MS Memory Model (+opts)   */
  10. #define MSDSEG  158                     /* BEh - MS Forced 'DOSSEG' switch */
  11. #define MSILIB  159                     /* A0h - MS INCLUDELIB directive   */
  12. #define MSEXTN  161                     /* A1h - MS Extensions Enabled     */
  13. #define UNKNWN  162                     /* A2h - (?)                       */
  14. #define MSLNAM  163                     /* A3h - MS Library Module Name    */
  15. #define PATIME  221                     /* DDh - Phoenix Time Stamp        */
  16. #define PACMNT  255                     /* FFh - Phoenix Comment           */
  17. #define TCXSYMTYPIX 0xe0
  18. #define TCPUBSYMTYP 0xe1
  19. #define TCSTRUCT 0xe2
  20. #define TCTYPDEF 0xe3
  21. #define TCENUM   0xe4
  22. #define TCBEGSCP 0xe5
  23. #define TCLOCDEF 0xE6
  24. #define TCENDSCP 0xe7
  25. #define TCSOURCE 0xe8
  26. #define TCDEPFIL 0xe9
  27. #define TCXLATOR 0xea
  28. #define TCMANGLE 0xf8
  29.  
  30. static char *models[] = {
  31.   "tiny","small","medium","compact","large","huge"
  32. };
  33.  
  34. typedef struct {
  35.   word seconds:5;
  36.   word minute:6;
  37.   word hour:5;
  38. } TIME;
  39.  
  40.  
  41. typedef struct {
  42.   word day:5;
  43.   word month:4;
  44.   word year:7;
  45. } DATE;
  46.  
  47. static char *months[] = {
  48.   "(nul)",
  49.   "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  50.   "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
  51. };
  52.  
  53. static void sprint_date(char*string,char*datestr)
  54. {
  55.   TIME time;
  56.   DATE date;
  57.  
  58.   time = *(TIME*)datestr;
  59.   date = *(DATE*)&datestr[2];
  60.   sprintf(string, "%02d:%02d:%02d on %.3s %d, %04d", time.hour, time.minute, time.seconds,
  61.                 months[date.month], date.day, date.year+1980);
  62. }
  63.  
  64.  
  65. int scope_compare(SCOPE_T *btreescope, SCOPE_T *scope)
  66. {
  67.   if ( btreescope->hex_offset > scope->hex_offset ) {
  68.       return( LEFT );
  69.   } else {
  70.       if ( btreescope->hex_offset < scope->hex_offset ) {
  71.           return( RIGHT );
  72.       } else {
  73.           return( EQUAL );
  74.       }
  75.   }
  76. }
  77.  
  78.  
  79.  
  80. void coment( word length)
  81. {
  82.   char            junk[3];
  83.   char            *comment;
  84.   char            text[80];
  85.   char            temp[80];
  86.   int             type;
  87.   int             class;
  88.   char            cksum;
  89.   uchar           *prt_char;
  90.   int             i;
  91.   int             w;
  92.   char            *p;
  93.   LOCAL_VAR       *local_var;
  94.   static word     scope_type = VT_VAR;
  95.   static NODE_T **ppScope_tree;
  96.   static SCOPE_T *pScope;
  97.   static SCOPE_T **ppScope;
  98.   static SCOPE_T *arg_scope;
  99.   static SCOPE_T *loc_scope;
  100.  
  101.   type = get_byte();
  102.   class = get_byte();
  103.   length -= 3;
  104.   if (length)
  105.     comment = o_malloc(length);
  106.   else
  107.     comment = junk;
  108.   get_str( length, comment);
  109.   switch( class ) {
  110.   case MSLANG:
  111.        out_line( "", "; Compiler:", comment, "" );
  112.        break;
  113.   case MSMODL:
  114.        processor_type_comment_occurred = TRUE;
  115.        switch( comment[0] ) {
  116.        case '3':
  117.             out_line( "", ".386p", "", "" );
  118.             out_line( "", ".387", "", "" );
  119.             processor_mode = 386;
  120.             break;
  121.        case '2':
  122.             out_line( "", ".286p", "", "" );
  123.             out_line( "", ".287", "", "" );
  124.             processor_mode = 286;
  125.             break;
  126.        case '1':
  127.             out_line( "", ".186", "", "" );
  128.             out_line( "", ".187", "", "" );
  129.             processor_mode = 186;
  130.             break;
  131.        case '0':
  132.             out_line( "", ".8086", "", "" );
  133.             out_line( "", ".8087", "", "" );
  134.             processor_mode = 8086;
  135.             break;
  136.        default:
  137.             fmt_error( "Unknown Processor Type" );
  138.             break;
  139.        }
  140.        switch( comment[1] ) {
  141.        case 'c':
  142.             out_line( "", "; Compact Memory Model", "", "" );
  143.             break;
  144.        case 's':
  145.             out_line( "", "; Small Memory Model", "", "" );
  146.             break;
  147.        case 'm':
  148.             out_line( "", "; Medium Memory Model", "", "" );
  149.             break;
  150.        case 'l':
  151.             out_line( "", "; Large Memory Model", "", "" );
  152.             break;
  153.        case 'h':
  154.             out_line( "", "; Huge Memory Model", "", "" );
  155.             break;
  156.        default:
  157.             fmt_error( "Unknown Model" );
  158.             break;
  159.        }
  160.        if ( comment[2] == 'O' )
  161.            out_line( "", "; Optimizations Enabled", "", "" );
  162.        break;
  163.   case MSDSEG:
  164.        out_line( "", "; Force DOSSEG linker option", "", "" );
  165.        break;
  166.   case MSILIB:
  167.        out_line( "", "includelib", comment, "" );
  168.        break;
  169.   case MSEXTN:
  170.        if (length) {
  171.          if ( !strcmp( comment, "\001CV" ) ) {
  172.              out_line( "", "; CodeView Enabled", "", "" );
  173.          } else {
  174.              fmt_error( "Unknown CodeView Option" );
  175.          }
  176.        }
  177.        break;
  178.   case UNKNWN:
  179.        out_line( "", "; Linker - Pass two marker","","");
  180.        break;
  181.   case PATIME:
  182.        if ( comment[0] != 16 )
  183.          fmt_error( "Unknown Phoenix Time Stamp Prefix" );
  184.        out_line( "", "; Time: ", &comment[1], "" );
  185.        break;
  186.   case PACMNT:
  187.        out_line( "", ";", comment, "" );
  188.        break;
  189.  
  190. /*
  191.    Extensions to COMENT record defined by Borland.
  192.  
  193.    Note that these have been deduced using TDUMP (and lots of examples)
  194.    and consequently may be completely wrong.
  195.                                                                    [rh]
  196. */
  197.  
  198.   case TCXSYMTYPIX:
  199.        sprintf(text, "; External symbol type index %02X", *comment, comment[1]&1);
  200.        out_line(text,"","","");
  201.        break;
  202.  
  203.   case TCPUBSYMTYP:
  204.        sprintf(text, "; Public symbol type %02X, function return offset %02X", *comment, comment[1]&1);
  205.        out_line(text,"","","");
  206.        break;
  207.  
  208.   case TCSTRUCT:
  209.        out_line("; typedef struct:","","","");
  210.        i = 1;
  211.        while (i<length) {
  212.          out_newline();
  213.          sprintf(text, "; \"%.*s\"",comment[i],&comment[i+1]);
  214.          i+=comment[i]+1;
  215.          sprintf(temp, "type %02X",comment[i]); /* ;* */
  216.          i+=2;
  217.          out_line(text,"","",temp);
  218.        }
  219.        break;
  220.  
  221.   case TCDEPFIL:
  222.        if (length<=3) {
  223.          out_line("; End of dependency list","","","");
  224.        } else {
  225.          sprintf(text,"%.*s",(int)comment[4],&comment[5]);
  226.          out_line("; Dependent file: ",text,"","");
  227.        }
  228.        break;
  229.  
  230.   case TCENDSCP:
  231.        pScope = o_malloc(sizeof(SCOPE_T));
  232.        pScope->hex_offset = *(int*)comment;
  233.        pScope = insert(pScope, end_scope_tree,TC scope_compare)->data;
  234.        sprintf(text, "; End of scope at offset %04X",*(int*)comment);
  235.        out_line(text,"","","");
  236.        break;
  237.  
  238.   case TCBEGSCP:
  239.        if (scope_type==VT_ARG)
  240.          scope_type = VT_VAR;
  241.        else
  242.          scope_type = VT_ARG;
  243.        if (scope_type==VT_ARG) {
  244.          ppScope_tree = &arg_scope_tree;
  245.          ppScope      = &arg_scope;
  246.        } else {
  247.          ppScope_tree = &loc_scope_tree;
  248.          ppScope      = &loc_scope;
  249.        }
  250.        *ppScope = o_malloc(sizeof(SCOPE_T));
  251.        (*ppScope)->hex_offset = *(int*)&comment[1];
  252.        *ppScope = insert(*ppScope,*ppScope_tree, TC scope_compare)->data;
  253.        sprintf(text,"; Begin scope segment %04X, offset %04X",(int)*comment,*(int*)&comment[1]);
  254.        out_line(text,"","","");
  255.        break;
  256.  
  257.   case TCLOCDEF:
  258.        out_line("; Local definitions:","","","");
  259.        i = 0;
  260.        local_var = (*ppScope)->head = o_malloc(sizeof(LOCAL_VAR));
  261.        while (i+1<length) {
  262.          if (i!=0)
  263.            local_var=local_var->next = o_malloc(sizeof(LOCAL_VAR));
  264.          out_newline();
  265.          sprintf(text,"; \"%.*s\"",comment[i],&comment[i+1]);
  266.          sprintf(local_var->vname,"%.*s",comment[i],&comment[i+1]);
  267.          i+=comment[i]+1;
  268.          sprintf(temp,", type %02X, class %02X",comment[i],comment[i+1]&7);
  269.          strcat(text,temp);
  270.          *temp = 0;
  271.          i++;
  272.          local_var->class = comment[i]&7;
  273.          switch (comment[i]&7) {
  274.          case 7:
  275.               sprintf(temp, " (instance of typed variable)");
  276.               local_var->bInfo1 = comment[i+1];
  277.               i++;
  278.               break;
  279.          case 6:                           /* local typedef ? */
  280.               sprintf(temp, " (local typedef)");
  281.               local_var->bInfo1 = comment[i+1];
  282.               i++;
  283.               break;
  284.          case 4:                          /* register variable */
  285.               i++;
  286.               switch (comment[i]) {
  287.               case 0x06: p = "si"; break;
  288.               case 0x07: p = "di"; break;
  289.               default  : p = "[unknown]"; break;
  290.               }
  291.               local_var->bInfo1 = comment[i];
  292.               sprintf(temp," variable in register %s",p);
  293.               i++;
  294.               local_var->bInfo2 = comment[i];
  295.               break;
  296.          case 2:                        /* variable */
  297.               local_var->bInfo1 = comment[i]; /* argument or local */
  298.               sprintf(temp," (var) %s stored in ",comment[i]&8?"argument":"local");
  299.               strcat(text,temp);
  300.               switch (comment[i++]&7) {
  301.               case 2 :                          /* stored on stack */
  302.                    local_var->bInfo2 = (comment[i-1]&7)==2; /* stored on stack */
  303.                    local_var->wInfo1 = *(int*)&comment[i]; /* address */
  304.                    w = *(int*)&comment[i++];
  305.                    if (w<0)
  306.                      sprintf(temp,"[bp-%04X]",-w);
  307.                    else
  308.                      sprintf(temp,"[bp+%04X]",w);
  309.                    break;
  310.               default :
  311.                    strcpy(temp,"[unknown]");
  312.                    break;
  313.               }
  314.               i++;
  315.               break;
  316.          case 0:                  /* static function */
  317.               sprintf(temp, " (static func) index %04X, word %04X", *(int*)&comment[i+1],*(int*)&comment[i+3]);
  318.               i+=5;
  319.          }
  320.          strcat(text,temp);
  321.          out_line(text,"","","");
  322.        }
  323.        break;
  324.  
  325.   case TCTYPDEF:
  326.        sprintf(text, "; Type definition: index %02X ",*(int*)&comment[0]);
  327.        i = 1;
  328.        if (comment[1]) {
  329.          sprintf(temp, "\"%.*s\", ",comment[1],&comment[2]); /* name */
  330.          strcat(text,temp);
  331.        }
  332.        i+=comment[i]+1;
  333.        sprintf(temp, "size %04X, TID %02X",*(int*)&comment[i],comment[i+2]);
  334.        strcat(text,temp);
  335.        out_line(text,"","","");
  336.        break;
  337.  
  338.   case TCSOURCE :
  339.        if (!*comment) {
  340.          i = 1;
  341.          sprintf(text, "; Source file %.*s",comment[1],&comment[2]);
  342.          i+=comment[1]+1;
  343.          sprint_date(temp,&comment[i]);
  344.          out_line(text,temp,"","");
  345.        } else {
  346.          out_line("; Source file","","","");
  347.        }
  348.        break;
  349.  
  350.   case TCXLATOR :
  351.        strcpy(text, "; Compiler: ");
  352.        switch (*comment) {
  353.        case 0x01: strcat(text,"'C'");       break;
  354.        case 0x04: strcat(text,"Assembler"); break;
  355.        default :  strcat(text,"[unknown]"); break;
  356.        }
  357.        sprintf(temp, " using %s model with underscores %s",
  358.                models[comment[1]&7],comment[1]&8?"on":"off");
  359.        strcat(text,temp);
  360.        out_line(text,"","","");
  361.        break;
  362.  
  363.   case TCENUM :
  364.        i = 1;
  365.        out_line("; ENUM member list","","","");
  366.        while (i<length) {
  367.          sprintf(text,"; %.*s",comment[i],&comment[i+1]);
  368.          i+=comment[i]+1;
  369.          sprintf(temp, " = %04X",*(word*)&comment[i]);
  370.          i+=3;
  371.          strcat(text,temp);
  372.          out_line(text,"","","");
  373.          out_newline();
  374.        }
  375.        break;
  376.  
  377.   case TCMANGLE:
  378.        sprintf(temp, "; Mangled name \"%.*s\"",*comment, &comment[1]);
  379.        out_line(temp,"","","");
  380.        break;
  381.  
  382.   default:
  383.        text[0] = '\0';
  384.        prt_char = comment;
  385.        while ( length ) {
  386.            if ( isprint(*prt_char) ) {
  387.                sprintf( temp, "%c", *prt_char );
  388.            } else {
  389.                sprintf( temp, "[%02X]", *prt_char );
  390.            }
  391.            strcat( text, temp );
  392.            prt_char++;
  393.            --length;
  394.        }
  395.        sprintf( temp, "; Unknown COMENT Record (Class %d): '%s'", class, text );
  396.        out_line("", temp, "", "" );
  397.        break;
  398.   }
  399.   out_newline();
  400.   cksum = get_byte();
  401.   cksum = cksum;
  402.   type = type;
  403.   if (comment!=junk)
  404.     free(comment);
  405. }
  406.